package com.cy.features;

import java.util.ArrayList;
import java.util.List;

/**
 *泛型?
 * 1)泛型是编译时的一种类型,用于约束类中属性,方法参数,返回值类型,DNA运行时无效
 * 2)泛型应用场景?(写框架-共性问题,写工具类,写通用方法)
 * 3)泛型应用类型?(类泛型,方法泛型)
 * 3.1)类泛型:语法-类名或接口名<泛型>(class ClassA<T>{},class ClassB<K,V,P,D>)
 * 类泛型约束中实例属性,非静态方法参数,非静态返回值类型
 * 3.2)方法泛型:语法-><泛型>方法返回值类型<泛型>方法名 (参数列表)
 * 方法泛型应用最多的场景是静态方法(static <T>void print(T t){})
 * 4)泛型限定通配符
 * 4.1)? 无界通配符
 * 4.2)? super T 下界通配符
 * 4.3)? extends  T 上届限定通配符
 */

public class GenericTests01 {
    /**
     * 类泛型
     * @param <E>
     */
    static class Container<E>{//new Container<String>()
        void add(E t){}
        E get(){return null ;}
    }

    /**
     * 泛型方法,? extends 通常应用于获取值
     * @param t
     * @param <T>
     */
    static <T extends Number>void print(T t){}

    /**
     * 泛型方法,? super只能应用于存数据  下界限定通配符
     */
    static <T > void show(List<? super String> t){}//泛型下界通配符

    public static void main(String[] args){
        print(100);//Integer 继承 Number

        List<String> list1 = new ArrayList<>();
        List<Object> list2 = new ArrayList<>();
        List<CharSequence> list3 = new ArrayList<>();
        show(list1);
        show(list2);
        show(list3);
        List<Integer> list4=new ArrayList<>();
        List<Long> list5 = new ArrayList<>();
        display(list5);
        display(list4);
    }

    static  void display(List<? extends Number> t){}//泛型上界通配符
}
